home *** CD-ROM | disk | FTP | other *** search
/ Utilities Professional 1-1500 / Utilities Professional 1-1500 (1994)(WPD)[!].iso / 12511500 / var1273.dms / var1273.adf / AmiCDROM / cdcontrol.c < prev    next >
C/C++ Source or Header  |  1992-09-02  |  5KB  |  199 lines

  1. /* cdcontrol.c:
  2.  *
  3.  * Control program for the AmiCDROM handler.
  4.  *
  5.  * ----------------------------------------------------------------------
  6.  * This code is (C) Copyright 1993 by Frank Munkert.
  7.  * All rights reserved.
  8.  * This software may be freely distributed and redistributed for
  9.  * non-commercial purposes, provided this notice is included.
  10.  */
  11.  
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14.  
  15. #include <clib/dos_protos.h>
  16. #include <clib/exec_protos.h>
  17. #include <clib/utility_protos.h>
  18.  
  19. #include <exec/memory.h>
  20.  
  21. #ifdef AZTEC_C
  22. #include <pragmas/dos_lib.h>
  23. #include <pragmas/exec_lib.h>
  24. #include <pragmas/utility_lib.h>
  25. #endif
  26. #ifdef LATTICE
  27. #include <pragmas/dos_pragmas.h>
  28. #include <pragmas/exec_pragmas.h>
  29. #include <pragmas/utility_pragmas.h>
  30. #endif
  31.  
  32. #include "cdcontrol.h"
  33.  
  34. struct Library *UtilityBase = NULL;
  35.  
  36. struct MsgPort *g_device_proc;
  37.  
  38. enum partype {
  39.   PAR_NONE,
  40.   PAR_ANY,
  41.   PAR_ON_OFF
  42. };
  43.  
  44. void Cleanup (void)
  45. {
  46.   if (UtilityBase)
  47.     CloseLibrary (UtilityBase);
  48. }
  49.  
  50. void Send_Packet (int p_cmd, void *p_1, void *p_2)
  51. {
  52.   struct MsgPort *replyport = CreateMsgPort ();
  53.   struct StandardPacket *packet = AllocMem (sizeof (struct StandardPacket),
  54.                           MEMF_CLEAR | MEMF_PUBLIC);
  55.   long res1, res2;
  56.  
  57.   if (!packet || !replyport) {
  58.     fprintf (stderr, "ERROR: cannot send packet\n");
  59.     exit (1);
  60.   }
  61.   
  62.   packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt);
  63.   packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
  64.  
  65.   packet->sp_Pkt.dp_Port = replyport;
  66.   packet->sp_Pkt.dp_Type = ACTION_USER;
  67.   packet->sp_Pkt.dp_Arg1 = p_cmd;
  68.   packet->sp_Pkt.dp_Arg2 = (ULONG) p_1;
  69.   packet->sp_Pkt.dp_Arg3 = (ULONG) p_2;
  70.  
  71.   PutMsg (g_device_proc, (struct Message *) packet);
  72.   WaitPort (replyport);
  73.   GetMsg (replyport);
  74.  
  75.   res1 = packet->sp_Pkt.dp_Res1;
  76.   res2 = packet->sp_Pkt.dp_Res2;
  77.   if (res1 == 0)
  78.     PrintFault (res2, (UBYTE *) "ERROR");
  79.  
  80.   FreeMem (packet, sizeof (struct StandardPacket));
  81.   DeleteMsgPort (replyport);
  82. }
  83.  
  84. void Cmd_Lowercase (void *p_1, void *p_2)
  85. {
  86.   Send_Packet (CDCMD_LOWERCASE, p_1, p_2);
  87. }
  88.  
  89. void Cmd_Mactoiso (void *p_1, void *p_2)
  90. {
  91.   Send_Packet (CDCMD_MACTOISO, p_1, p_2);
  92. }
  93.  
  94. void Cmd_Convertspaces (void *p_1, void *p_2)
  95. {
  96.   Send_Packet (CDCMD_CONVERTSPACES, p_1, p_2);
  97. }
  98.  
  99. void Cmd_Showversion (void *p_1, void *p_2)
  100. {
  101.   Send_Packet (CDCMD_SHOWVERSION, p_1, p_2);
  102. }
  103.  
  104. void Cmd_Hfsfirst (void *p_1, void *p_2)
  105. {
  106.   Send_Packet (CDCMD_HFSFIRST, p_1, p_2);
  107. }
  108.  
  109. void Cmd_Dataext (void *p_1, void *p_2)
  110. {
  111.   Send_Packet (CDCMD_DATAEXT, p_1, p_2);
  112. }
  113.  
  114. void Cmd_Resourceext (void *p_1, void *p_2)
  115. {
  116.   Send_Packet (CDCMD_RESOURCEEXT, p_1, p_2);
  117. }
  118.  
  119. struct par {
  120.   char *name;
  121.   char *abbrev;
  122.   enum partype par1;
  123.   enum partype par2;
  124.   void (*func)(void *, void *);
  125. } g_par[] = {
  126.   "lowercase",       "l",  PAR_ON_OFF,    PAR_NONE,    Cmd_Lowercase,
  127.   "mactoiso",       "mi", PAR_ON_OFF,    PAR_NONE,    Cmd_Mactoiso,
  128.   "convertspaces", "cs", PAR_ON_OFF,    PAR_NONE,    Cmd_Convertspaces,
  129.   "showversion",   "sv", PAR_ON_OFF,    PAR_NONE,    Cmd_Showversion,
  130.   "hfsfirst",       "hf", PAR_ON_OFF,    PAR_NONE,    Cmd_Hfsfirst,
  131.   "dataext",       "de", PAR_ANY,    PAR_NONE,    Cmd_Dataext,
  132.   "resourceext",   "re", PAR_ANY,    PAR_NONE,    Cmd_Resourceext,
  133. };
  134.  
  135. void Usage (void)
  136. {
  137.   printf (
  138.     "Usage: cdcontrol device command\n"
  139.     "  Commands & parameters    Abbrev.   Meaning\n"
  140.     "  ---------------------    -------   -------\n"
  141.     "  lowercase [on/off]       l         Convert ISO filenames to lowercase\n"
  142.     "  mactoiso [on/off]        mi        Convert Mac to Amiga characters\n"
  143.     "  convertspaces [on/off]   cs        Convert HFS spaces into underscores\n"
  144.     "  showversion [on/off]     sv        Show version number of ISO filenames\n"
  145.     "  hfsfirst [on/off]        hf        Look for a HFS partition first\n"
  146.     "  dataext <extension>      de        Set extension for HFS data forks\n"
  147.     "  resourceext <extension>  re        Set extension for HFS resource forks\n"
  148.     "Examples:\n"
  149.     "  cdcontrol cd0: showversion on\n"
  150.     "  cdcontrol cd0: sv on\n"
  151.     );
  152.  
  153.   exit (1);
  154. }
  155.  
  156. void main (int argc, char *argv[])
  157. {
  158.   int i;
  159.  
  160.   atexit (Cleanup);
  161.  
  162.   if (argc != 4)
  163.     Usage ();
  164.  
  165.   if (!(UtilityBase = (struct Library *)
  166.          OpenLibrary ((UBYTE *) "utility.library", 37))) {
  167.     fprintf (stderr, "cannot open utility.library\n");
  168.     exit (1);
  169.   }  
  170.  
  171.   g_device_proc = DeviceProc ((UBYTE *) argv[1]);
  172.   if (!g_device_proc) {
  173.     fprintf (stderr, "ERROR: cannot find device \"%s\"\n", argv[1]);
  174.     exit (1);
  175.   }
  176.  
  177.   for (i=0; i < (sizeof (g_par) / sizeof (struct par)); i++) {
  178.     if (Stricmp ((UBYTE *) argv[2], (UBYTE *) g_par[i].name) == 0 ||
  179.         Stricmp ((UBYTE *) argv[2], (UBYTE *) g_par[i].abbrev) == 0) {
  180.       void *a = argv[3];
  181.       void *b = NULL;
  182.  
  183.       if (g_par[i].par1 == PAR_ON_OFF)
  184.         if (Stricmp ((UBYTE *) argv[3], (UBYTE *) "on") == 0)
  185.           a = (void *) 1;
  186.         else if (Stricmp ((UBYTE *) argv[3], (UBYTE *) "off") == 0)
  187.           a = (void *) 0;
  188.     else {
  189.       fprintf (stderr, "ERROR: \"on\" or \"off\" expected\n");
  190.       exit (1);
  191.         }
  192.  
  193.       g_par[i].func (a, b);
  194.       exit (0);
  195.     }
  196.   }
  197.   Usage ();
  198. }
  199.